#ifndef SPRITEANIMADO_H
#define SPRITEANIMADO_H

#include <SFML/Graphics.hpp>
#include <vector>
#include <map>

#include "image_manager.h"

namespace gge
{

struct Secuencia
{
	Secuencia()
	{
		listaFrames.clear();
		duracion=0;
		nombre="";
		frameActual=0;
	}
	
	std::vector <sf::Sprite> listaFrames;
	std::vector <sf::Image> listaImagenes;
	float duracion;
	std::string nombre;
	int frameActual;
};
	
class SpriteAnimado 
{

public:
	SpriteAnimado();
	SpriteAnimado(sf::RenderTarget *);
	~SpriteAnimado();

	bool CrearDeArchivo(std::string url);
	
	void AgregarSecuencia(Secuencia sec);
	void AgregarSecuencia(std::vector<sf::Sprite> lista, std::string nombre, float duracion);
	
	Secuencia *ObtenerSecuencia(int indice);
	Secuencia *ObtenerSecuencia(std::string nombre);
	
	Secuencia *SecuenciaActual();
	
	sf::Sprite CuadroActual();
	
	void CambiarSecuencia(int indice);
	void CambiarSecuencia(std::string nombre);
	
	void SiguienteSecuencia(int indice);
	void SiguienteSecuencia(std::string nombre);
	
	float Tiempo();
	bool SecuenciaTerminada();
	
	void Animar(bool ciclo=false);
	void Detener();
	//void Reiniciar();
	
	void Actualizar();

	void CambiarPosicion(sf::Vector2f pos);
	sf::Vector2f ObtenerPosicion();
	
	void Rotar(float angulo);
	float ObtenerRotacion();
	
	void VoltearX(bool volteado);
	void VoltearY(bool volteado);
	
	bool VolteadoX();
	bool VolteadoY();
	
	void Invertir(bool invertido);
	bool Invertido();
	
protected:
	void Limpiar();
	
private:
	std::vector<Secuencia> m_listaSecuencias;
	int m_secuenciaActual;
	int m_siguienteSecuencia;
	bool m_reproduciendo;
	sf::Clock m_tiempo;
	bool m_ciclo;
	bool m_invertido;
	bool m_volteadoX;
	bool m_volteadoY;
	
	float m_rotacion;
	sf::Vector2f m_posicion;
	
	image_manager m_imageManager;
};

}

#endif // SPRITEANIMADO_H
